package main

import "fmt"

// 接口定义: type 接口名 interface{}
// 接口内只能定义函数,不能定义字段,函数也无需使用func关键字
// 接口的本质是一组行为的抽象
// 尽量面向接口编程

// List List接口定义
type List interface {
	// Add 在指定位置添加元素
	Add(idx int, val int)

	// Append 在末尾追加元素
	Append(val int)

	// Get 获取指定位置的元素
	Get(idx int) int

	// Delete 删除指定位置的元素
	Delete(idx int)
}

// 链表的节点
type node struct {
	val  int
	next *node

	//tail node	结构体不可以自引用,只能使用指针,因为编译器需要在编译阶段就确认结构体的大小
}

// LinkedList 基于链表实现的List,实现了List接口
// (Duck Type)当一个结构体实现了某个接口的所有方法时,就说该结构体实现了这个接口
type LinkedList struct {
	head *node
}

func (l *LinkedList) Add(idx int, val int) {
	fmt.Printf("LinkedList#Add: 在[%d]位置添加元素[%d]\n", idx, val)
}

func (l *LinkedList) Append(val int) {
	fmt.Printf("LinkedList#Append: 在末尾追加元素[%d]\n", val)
}

func (l *LinkedList) Get(idx int) int {
	fmt.Printf("LinkedList#Get: 获取[%d]位置的元素\n", idx)
	return 1
}

func (l *LinkedList) Delete(idx int) {
	fmt.Printf("LinkedList#Delete: 删除[%d]位置的元素\n", idx)
}
